// 信息提示
import { Message } from 'element-ui'
// 引入用户id
import { getToken } from '@/utils/auth'

import { getInfo } from '@/api/login'

if (!window.location.origin) {
  window.location.origin = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ':' + window.location.port: '');
}
// websocket地址
// var url = 'ws://127.0.0.1:8080/websocket/message';
var url =  'ws://149.88.72.33/prod-api/websocket/message';
//var url= 'ws://'+(window.location.origin.replace("http://",""))+":8080/websocket/message";
// websocket实例
var ws;
// 重连定时器实例
var tt;
// websocket重连开关
var websocketswitch = false;

// websocket对象
var websocket = {
  // websocket建立连接
  Init () {
    // 判断浏览器是否支持websocket
    if (!'WebSocket' in window) {
      this.$modal.msgError('您的浏览器不支持WebSocket')
      return
    }

    // 获取用户id
    // let userId = getTenantId();
    let userId = "";
    getInfo().then(res => {
      console.log('username', res.user.userId)
      userId = res.user.userId;
    })
      // this.$route.params && this.$route.params.userId;

    // 创建websocket实例
    ws = new WebSocket(url + '?userId=' + userId)
    // 监听websocket连接
    ws.onopen = function () {
      // Message({
      //   type: 'success',
      //   message: 'websocket连接成功'
      // })
    }
    // 监听websocket连接错误信息
    ws.onerror = function (e) {
      console.log('重连开关', websocketswitch)
      console.log('数据传输发生错误', e)
      Message({
        message: 'websocket传输发生错误',
        type: 'error'
      })
      // 打开重连
      reconnect()
    }
    // 监听websocket接受消息
    ws.onmessage = function (e) {
      console.log('接收后端消息:' + e.data)
      ws_heartCheck.reset().start();
      //心跳消息不做处理
      if (e.data === 'ok') {
        return
      }
      // Message({
      //   message: e.data,
      //   type: 'success'
      // })
    }
  },
  // websocket连接关闭方法
  Close () {
    //关闭断开重连机制
    websocketswitch = true
    ws.close()
  },
  // websocket发送信息方法
  Send (data) {
    // 处理发送数据JSON字符串
    let msg = JSON.stringify(data)
    // 发送消息给后端
    ws.send(msg)
  },
  // 暴露websocket实例
  getwebsocket () {
    return ws
  }
}

// 监听窗口关闭事件，当窗口关闭时-每一个页面关闭都会触发-扩张需求业务
window.onbeforeunload = function () {
  console.log('测试方法执行了')
}

// 浏览器刷新重新连接
// 刷新页面后需要重连-并且是在登录之后
if (window.performance.navigation.type == 1 && getToken()) {
  console.log('浏览器刷新了')
  //刷新后重连
  websocket.Init()
}
// 重连方法
function reconnect () {
  console.log('重连开关', websocketswitch)
  // 判断是否主动关闭连接
  if (websocketswitch) {
    return
  }
  // 重连定时器-每次websocket错误方法onerror触发他都会触发
  tt && clearTimeout(tt)
  tt = setTimeout(function () {
    console.log('执行断线重连...')
    websocket.Init()
    websocketswitch = false
  }, 1000)
}
var ws_heartCheck = {
  timeout: 5000,			// 5秒一次心跳
  timeoutObj: null,		// 执行心跳的定时器
  serverTimeoutObj: null,	// 服务器超时定时器
  reset: function(){		// 重置方法
    clearTimeout(this.timeoutObj);
    clearTimeout(this.serverTimeoutObj);
    return this;
  },
  start: function(){		// 启动方法
    var self = this;
    this.timeoutObj = setTimeout(function(){
      // 这里发送一个心跳信息，后端收到后，返回一个消息，在onmessage拿到返回的心跳（信息）就说明连接正常
      ws.send("check");
      // 如果超过一定时间还没重置，说明后端主动断开了
      self.serverTimeoutObj = setTimeout(function(){
        // 如果onclose会执行reconnect，我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次
        // ws.close();
        self.reset();
      }, self.timeout);
    }, this.timeout);
  }
}

// 暴露对象
export default websocket
